package upcweb.dao;

import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import upcweb.modelo.ClsComentarioOferta;
import upcweb.modelo.ClsOferta;
import upcweb.util.ClsReturn;

public class OfertaDAO {

	private SQLProcDAO sqlDAO = new SQLProcDAO();

	public ClsOferta getOfertaByNum(ClsOferta objOfe) {
		ClsOferta oferta = null;
		try {
			oferta = getOfertas(objOfe).get(0);
			ComentariosDAO comDAO = new ComentariosDAO();
			oferta.setLstComentarios(getComents(objOfe));
		} catch (ArrayIndexOutOfBoundsException e1) {
			// No se ha encontrado la oferta
			oferta = null;
		} catch (Exception e2) {
			// TODO: handle exception
			e2.printStackTrace();
		}
		return oferta;
	}

	public ArrayList<ClsOferta> getOfertasActivas(ClsOferta clsOf) {
		ArrayList<ClsOferta> arrOfe = new ArrayList<ClsOferta>();
		try {
			ResultSet rs = sqlDAO
					.getData(
							"select * from vofertas a inner join vservicios b on a.co_servicio = b.co_servicio where curdate() between fe_inicio and fe_final",
							new Object[] {});
			while (rs.next()) {
				ClsOferta objOf = new ClsOferta();
				objOf.setNo_Oferta(rs.getString("co_oferta"));
				objOf.setFe_creacion(rs.getString("fe_creacion"));
				objOf.setFe_inicio(rs.getString("fe_inicio"));
				objOf.setFe_final(rs.getString("fe_final"));
				objOf.setNo_descripcion(rs.getString("no_descripcion"));
				objOf.setNo_ubic_page(rs.getString("no_ubicacion_pagina"));
				objOf.setCo_servicio(rs.getString("co_servicio"));
				objOf.setNo_imagen(rs.getString("no_imagen"));
				objOf.setNo_servicio(rs.getString("no_servicio"));
				objOf.setNo_usuario(rs.getString("no_usuario"));
				objOf.setNo_porcentaje(rs.getInt("no_porcen"));
				arrOfe.add(objOf);
			}
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println(e.getMessage());
		}
		return arrOfe;
	}

	public ArrayList<ClsOferta> getOfertas(ClsOferta clsOf) {
		ArrayList<ClsOferta> arrOfe = new ArrayList<ClsOferta>();
		try {
			String sp_proc;
			Object[] parms = new Object[] {};
			if (clsOf != null) {
				if (!clsOf.getNo_Oferta().isEmpty()) {
					sp_proc = "{call sp_get_ofertas_by_num(?)}";
					parms = new Object[] { clsOf.getNo_Oferta() };
				} else {
					sp_proc = "{call sp_get_ofertas(?,?)}";
					parms = new Object[] { clsOf.getFe_inicio(),
							clsOf.getFe_final() };
				}
			} else {
				sp_proc = "{ call sp_get_all_ofertas() }";
			}
			ResultSet rs = sqlDAO.getData(sp_proc, parms);
			while (rs.next()) {
				ClsOferta objOf = new ClsOferta();
				objOf.setNo_Oferta(rs.getString("co_oferta"));
				objOf.setFe_creacion(rs.getString("fe_creacion"));
				objOf.setFe_inicio(rs.getString("fe_inicio"));
				objOf.setNo_usuario(rs.getString("no_usuario"));
				objOf.setFe_final(rs.getString("fe_final"));
				objOf.setNo_descripcion(rs.getString("no_descripcion"));
				objOf.setNo_ubic_page(rs.getString("no_ubicacion_pagina"));
				objOf.setCo_servicio(rs.getString("co_servicio"));
				objOf.setNo_servicio(rs.getString("no_servicio"));
				arrOfe.add(objOf);
			}
		} catch (Exception e) {
			e.printStackTrace();
			// TODO: handle exception
		}
		return arrOfe;
	}

	private ArrayList<ClsComentarioOferta> getComents(ClsOferta clsOf) {
		ArrayList<ClsComentarioOferta> arrComs = new ArrayList<ClsComentarioOferta>();
		try {
			ResultSet rs = sqlDAO
					.getData("{call sp_get_comentarios(?,?)}", new Object[] {
							clsOf.getNo_Oferta(), clsOf.getNo_usuario() });
			ClsComentarioOferta objCom;
			while (rs.next()) {
				objCom = new ClsComentarioOferta();
				objCom.setNo_Oferta(rs.getString("co_oferta"));
				objCom.setNo_comentario(rs.getInt("no_comentario"));
				objCom.setFe_coment(rs.getString("fe_creacion"));
				objCom.setHo_coment(rs.getString("ho_creacion"));
				objCom.setNo_usuario(rs.getString("no_usuario"));
				objCom.setLike(rs.getString("good"));
				objCom.setDislike(rs.getString("bad"));
				objCom.setTx_comentario(rs.getString("tx_comentario"));
				objCom.setNo_bien(rs.getInt("no_bien"));
				objCom.setNo_mal(rs.getInt("no_mal"));
				arrComs.add(objCom);
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return arrComs;
	}

	public ArrayList<ClsOferta> getOfertasnoVencidas() {
		ArrayList<ClsOferta> arrOfe = new ArrayList<ClsOferta>();
		try {
			String query = "select o.co_oferta,o.no_descripcion,o.no_ubicacion_pagina ";
			query += ",o.co_servicio,s.no_Servicio,DATE_FORMAT(o.fe_inicio,'%d-%m-%Y'),DATE_FORMAT(o.fe_final,'%d-%m-%Y') ";
			query += "from oferta o ";
			query += "    inner join  servicio s on s.co_Servicio=o.co_servicio ";
			query += "where now() <= o.fe_caducidad and o.fl_Activo=0 ";
			query += "";
			ResultSet rs = sqlDAO.getData(query, new Object[] {});
			while (rs.next()) {
				ClsOferta objOf = new ClsOferta();
				objOf.setNo_Oferta(rs.getString(1));
				objOf.setNo_descripcion(rs.getString(2));
				objOf.setNo_ubic_page(rs.getString(3));				
				objOf.setCo_servicio(rs.getString(4));				
				objOf.setNo_servicio(rs.getString(5));
				objOf.setFe_inicio(rs.getString(6));
				objOf.setFe_final(rs.getString(7));
				arrOfe.add(objOf);
			}
		} catch (Exception e) {
			// TODO: handle exception
			System.err.println(e.getMessage());
		}
		return arrOfe;
	}

   //Max romero Mant Oferta
  
	public ArrayList<ClsOferta> Oferta_Sells(ClsOferta clsOf) {
		 ArrayList<ClsOferta> arrOfer = new ArrayList<ClsOferta>();
		 try {
			 ResultSet rs = sqlDAO.getData("{call SP_Oferta_Sells(?,?)}", new Object[] {
					 clsOf.getNo_descripcion(), clsOf.getFl_activo() });
			 ClsOferta objCom;
			 while (rs.next()) {
					objCom = new ClsOferta();
					 objCom.setInt_co_oferta(rs.getInt("co_oferta"));
					 objCom.setNo_descripcion(rs.getString("no_descripcion"));
					objCom.setFe_caducidad(rs.getDate("fe_caducidad"));					 
					 objCom.setNo_ubic_page(rs.getString("no_ubicacion_pagina"));
					 objCom.setInt_co_servicio(rs.getInt("co_servicio"));
					 objCom.setFl_activo(rs.getString("fl_activo"));
					objCom.setDt_fe_creacion(rs.getDate("fe_creacion"));
					objCom.setDt_fe_inicio(rs.getDate("fe_inicio"));
					objCom.setDt_fe_final(rs.getDate("fe_final"));
					objCom.setNo_usuario(rs.getString("no_usuario"));
					arrOfer.add(objCom);
			 			}
	 		} catch (Exception e) {
	 		e.printStackTrace();
	 	}
		 return arrOfer;
 	}
	
	public ArrayList<ClsOferta> Oferta_Sell(ClsOferta clsOf) {
		 ArrayList<ClsOferta> arrOfer = new ArrayList<ClsOferta>();
		 ClsOferta objCom = null;// new ClsOferta();
		 try {
			 ResultSet rs = sqlDAO.getData("{call SP_Oferta_Sell(?)}", new Object[] {
					 clsOf.getInt_co_oferta()});
			 
			 while (rs.next()) {
					objCom = new ClsOferta();
					 objCom.setInt_co_oferta(rs.getInt("co_oferta"));
					 objCom.setNo_descripcion(rs.getString("no_descripcion"));
					objCom.setFe_caducidad(rs.getDate("fe_caducidad"));					 
					 objCom.setNo_ubic_page(rs.getString("no_ubicacion_pagina"));
					 objCom.setInt_co_servicio(rs.getInt("co_servicio"));
					 objCom.setFl_activo(rs.getString("fl_activo"));
					objCom.setDt_fe_creacion(rs.getDate("fe_creacion"));
					objCom.setDt_fe_inicio(rs.getDate("fe_inicio"));
					objCom.setDt_fe_final(rs.getDate("fe_final"));
					objCom.setFe_final(  dateToString(rs.getDate("fe_final")) );
					objCom.setFe_inicio(  dateToString(rs.getDate("fe_inicio")) );
					objCom.setNo_usuario(rs.getString("no_usuario"));
					arrOfer.add(objCom);
			 			}
	 		} catch (Exception e) {
	 			e.printStackTrace();
	 		}
		 return arrOfer;
	}
	
	public String dateToString(Date s_fecha){
    	String  fecha = null;
    	try {
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
            fecha = formatoFecha.format(s_fecha);
        } catch (Exception e) {
            fecha = null ;
        }
        return fecha;
    }
	
	public ClsReturn Oferta_ins(ClsOferta clCom){
        
        return sqlDAO.execQuery("{call SP_Oferta_ins(?,?,?,?,?,?,?,?,?)}",
                                                        new Object[]{        															 
        															clCom.getFe_final(),
        															clCom.getNo_descripcion(),
        															clCom.getNo_ubic_page(),
        															clCom.getInt_co_servicio(),
        															clCom.getFe_creacion(),
        															clCom.getFe_inicio(),
        															clCom.getFe_final(),
        															clCom.getFl_activo(),
        															clCom.getNo_usuario()
        															});    
}
	
	public ClsReturn Oferta_upd(ClsOferta clCom){
        //System.out.println("Start");
        return sqlDAO.execQuery("call SP_Oferta_upd(?,?,?,?,?,?,?,?,?,?)",
                                                        new Object[]{
        												clCom.getInt_co_oferta(), 
														clCom.getFe_final(),
														clCom.getNo_descripcion(),
														clCom.getNo_ubic_page(),
														clCom.getInt_co_servicio(),
														clCom.getFe_creacion(),
														clCom.getFe_inicio(),
														clCom.getFe_final(),
														clCom.getFl_activo(),
														clCom.getNo_usuario()
														});

}

	public ClsReturn Oferta_del(ClsOferta clCom){
        return sqlDAO.execQuery("call SP_Oferta_del(?)", new Object[]{ clCom.getInt_co_oferta() });
}


}
